home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2007 December
/
PCWKCD1207B.iso
/
+ TYLKO W WERSJI CYFROWEJ +
/
PCWK_PROG
/
Source
/
120
/
ukryte5
/
fukryte5.cpp
next >
Wrap
C/C++ Source or Header
|
2007-07-05
|
8KB
|
284 lines
//
// Andrzej Stasiewicz, czerwiec, 2007
// Dekodowanie obrazu ukrytego w wbrazie z kontrol╣ identyfikatora
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "fukryte5.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------
// Odczyt pliku, wy£wietlenie z lewej strony.
// Odczyt parametr≤w z nag│≤wka
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if( OpenPictureDialog1 -> Execute())
{
Image1 -> Picture -> LoadFromFile( OpenPictureDialog1 -> FileName);
Image1 -> Picture -> Bitmap -> PixelFormat = pf32bit;
odczytaj_naglowek();
}
}
//---------------------------------------------------------------------------
// Deszyfracja z kontrol╣ has│a
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int i, j;
TColor k;
int bajt;
unsigned char r, g, b;
if( !odczytaj_naglowek()) //na wszelki wypadek jeszcze raz przeczytajmy ...
return;
int twoj_id = Edit1 -> Text.ToInt();
if( twoj_id != id)
{
Application -> MessageBox( "Nie ma ukrytego obrazu albo z│y identyfikator.", "Uwaga ...", MB_OK);
return;
}
Label2 -> Caption = "Rozmiar: " + String( s) + " x " + String( w);
Label3 -> Caption = "Bity RGB: " + String( il_r) + " - " + String( il_g) + " - " + String( il_b);
Image2 -> Picture -> Bitmap -> Width = s;
Image2 -> Picture -> Bitmap -> Height = w;
Image2 -> Picture -> Bitmap -> PixelFormat = pf32bit;
for( i = 0; i < s; ++i)
{
for( j = 0; j < w; ++j)
{
r = g = b = 0;
bajt = odczytaj_bajt();
if( bajt == -1)
return;
r = bajt;
bajt = odczytaj_bajt();
if( bajt == -1)
return;
g = bajt;
bajt = odczytaj_bajt();
if( bajt == -1)
return;
b = bajt;
k = RGB( r, g, b);
Image2 -> Picture -> Bitmap -> Canvas -> Pixels[ i][ j] = k;
}
}
}
//---------------------------------------------------------------------------
// Zapis zdeszyfrowanego obrazka do pliku
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if( SavePictureDialog1 -> Execute())
{
Image2 -> Picture -> SaveToFile( SavePictureDialog1 -> FileName);
}
}
//---------------------------------------------------------------------------
// Funkcja elementarna.
// oddaj stan 0, 1, zgodnie z bitem poz w bajcie bajt
int TForm1 :: daj_bit( unsigned char bajt, int poz)
{
int bit;
unsigned char maska[ 8] = {1, 2, 4, 8, 16, 32, 64, 128}; //binarnie: '1', '10', '100', '1000', ...
if( bajt & maska[ poz])
bit = 1;
else
bit = 0;
return bit;
}
//---------------------------------------------------------------------------
// Funkcja elementarna.
// W bajcie 'bajt' nadaj bitowi 'poz' wartosc 'bit'
unsigned char TForm1 :: ustaw_bit( unsigned char bajt, int poz, int bit)
{
unsigned char maska[ 8] = {1, 2, 4, 8, 16, 32, 64, 128}; //'1', '10', '100', '1000', ...
if( bit == 1) //wpisywanie jedynki
{
bajt = bajt | maska[ poz];
}
else
{
bajt = bajt & (~maska[ poz]);
}
return bajt;
}
//---------------------------------------------------------------------------
// Odczytaj wartosc bit (=0, 1) w bie┐╣cym bicie obrazka g│≤wnego Image1
// Dokonaj przesuniΩcia wskaƒnik≤w pozycji bie┐╣cego bitu
// return: 0, 1 - warto£µ bitu,
// -1 - koniec obrazka.
int TForm1 :: odczytaj_bit( void)
{
int bit;
int szer = Image1 -> Picture -> Bitmap -> Width;
int wys = Image1 -> Picture -> Bitmap -> Height;
if( Y_POZ > wys)
return -1; //koniec obrazka - no£nika
TColor k = Image1 -> Picture -> Bitmap -> Canvas -> Pixels[ X_POZ][ Y_POZ];
unsigned char r = GetRValue( k);
unsigned char g = GetGValue( k);
unsigned char b = GetBValue( k);
switch( RGB_POZ)
{
case 0:
bit = daj_bit( r, BIT_POZ);
break;
case 1:
bit = daj_bit( g, BIT_POZ);
break;
case 2:
bit = daj_bit( b, BIT_POZ);
break;
}
BIT_POZ ++; //nastΩpny wskaƒniki na nastΩpny bit ...
if( RGB_POZ == 0) //... ale czy mie£ci siΩ w kanale R?
{
if( BIT_POZ >= il_r)
{
BIT_POZ = 0;
RGB_POZ = 1; //... je£li nie, przejdƒmy do kana│u G...
}
}
if( RGB_POZ == 1) //... ale czy mie£ci siΩ w kanale G? ...
{
if( BIT_POZ >= il_g)
{
BIT_POZ = 0;
RGB_POZ = 2; //... je£li nie, przejdƒmy do kana│u B ...
}
}
if( RGB_POZ == 2) //... ale czy mie£ci siΩ w kanale B? ...
{
if( BIT_POZ >= il_b)
{
BIT_POZ = 0;
RGB_POZ = 0;
X_POZ ++; //... je£li nie, przejdƒmy do nastΩpnego piksela
if( X_POZ >= szer)
{
X_POZ = 0;
Y_POZ ++;
}
}
}
return bit;
}
//---------------------------------------------------------------------------
// 8-krotne wywo│anie powy┐szej odczytaj_bit()
// gdy ret = -1 b│╣d czytania (koniec obrazka - no£nika)
int TForm1 :: odczytaj_bajt( void)
{
unsigned char bajt = 0;
int i, bit;
for( i = 0; i < 8; ++i)
{
bit = odczytaj_bit();
if( bit == -1)
return -1;
bajt = ustaw_bit( bajt, i, bit);
}
return bajt;
}
//---------------------------------------------------------------------------
// Odczytanie kodu rozpoznawczego, szerokosci, wysokosci i ilosci wykradanych bit≤w
// Uwaga - nag│≤wek jest zapisywany zawsze na 2 bitach w kana│ach R, G, B
// Pod koniec nag│≤wka przechodzimy na warto£ci zapisane w nag│≤wku
bool TForm1 :: odczytaj_naglowek( void)
{
X_POZ = 0; //start
Y_POZ = 0;
RGB_POZ = 0;
BIT_POZ = 0;
il_r = il_g = il_b = 2; //umowa - nag│≤wek wykrada ZAWSZE po 2 bity
int bajt;
unsigned char id_hi, id_lo;
unsigned char s_hi, s_lo, w_hi, w_lo;
unsigned char il_ra, il_ga, il_ba;
id_hi = id_lo = s_hi = s_lo = w_hi = w_lo = il_ra = il_ga = il_ba = 0;
bajt = odczytaj_bajt();
if( bajt == -1)
return false;
id_hi = bajt;
bajt = odczytaj_bajt();
if( bajt == -1)
return false;
id_lo = bajt;
id = (id_hi << 8) + id_lo; //z│o┐enie dw≤ch bajt≤w
bajt = odczytaj_bajt();
if( bajt == -1)
return false;
s_hi = bajt;
bajt = odczytaj_bajt();
if( bajt == -1)
return false;
s_lo = bajt;
s = (s_hi << 8) + s_lo; //z│o┐enie dw≤ch bajt≤w. Uwaga na priorytety i nawiasy!
bajt = odczytaj_bajt();
if( bajt == -1)
return false;
w_hi = bajt;
bajt = odczytaj_bajt();
if( bajt == -1)
return false;
w_lo = bajt;
w = (w_hi << 8) + w_lo; //z│o┐enie dw≤ch bajt≤w
bajt = odczytaj_bajt();
if( bajt == -1)
return false;
il_ra = bajt;
bajt = odczytaj_bajt();
if( bajt == -1)
return false;
il_ga = bajt;
bajt = odczytaj_bajt();
if( bajt == -1)
return false;
il_ba = bajt;
il_r = il_ra; //koniec umowy co do bitowej struktury nag│≤wka
il_g = il_ga;
il_b = il_ba;
return true;
}
//---------------------------------------------------------------------------